home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #include <exec/memory.h>
- #include <dos/dosextens.h>
- #ifdef __GNUC__
- #include <inline/dos.h>
- #include <inline/exec.h>
- #endif
- #include <stabs.h>
-
- extern void __seterrno(void);
-
- extern unsigned long *__stdfiledes;
-
- int __stat(struct stat *buf,struct FileInfoBlock *fib)
- {
- buf->st_dev=0;
- buf->st_ino=fib->fib_DiskKey;
- buf->st_mode=
- (fib->fib_DirEntryType<0?S_IFREG:
- (fib->fib_DirEntryType!=ST_SOFTLINK?S_IFDIR:S_IFLNK))|
- (fib->fib_Protection&FIBF_READ?0:S_IRUSR)|
- (fib->fib_Protection&FIBF_WRITE?0:S_IWUSR)|
- (fib->fib_Protection&FIBF_EXECUTE?0:S_IXUSR)|
- (fib->fib_Protection&FIBF_GRP_READ?S_IRGRP:0)|
- (fib->fib_Protection&FIBF_GRP_WRITE?S_IWGRP:0)|
- (fib->fib_Protection&FIBF_GRP_EXECUTE?S_IXGRP:0)|
- (fib->fib_Protection&FIBF_OTR_READ?S_IROTH:0)|
- (fib->fib_Protection&FIBF_OTR_WRITE?S_IWOTH:0)|
- (fib->fib_Protection&FIBF_OTR_EXECUTE?S_IXOTH:0);
- buf->st_nlink=0;
- buf->st_uid=fib->fib_OwnerUID;
- buf->st_gid=fib->fib_OwnerGID;
- buf->st_rdev=0;
- buf->st_size=fib->fib_Size;
- buf->st_atime=buf->st_mtime=buf->st_ctime=
- ((fib->fib_Date.ds_Days+2922)*1440+fib->fib_Date.ds_Minute)*60+
- fib->fib_Date.ds_Tick/TICKS_PER_SECOND;
- buf->st_spare1=buf->st_spare2=buf->st_spare3=0;
- buf->st_blksize=512;
- buf->st_blocks=fib->fib_NumBlocks;
- return 0;
- }
-
- int stat(const char *name,struct stat *buf)
- { struct FileInfoBlock *fib;
- BPTR lock;
- int ret=-1;
-
- if((lock=Lock((STRPTR)name,SHARED_LOCK))!=0)
- {
- if((fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))!=NULL)
- { if(Examine(lock,fib)!=DOSFALSE)
- ret=__stat(buf,fib);
- else
- __seterrno();
- FreeDosObject(DOS_FIB,fib);
- }
- else
- __seterrno();
- UnLock(lock);
- }
- else
- __seterrno();
-
- return ret;
- }
-
- int fstat(int d,struct stat *buf)
- { struct FileInfoBlock *fib;
- int ret=-1;
-
- if((fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))!=NULL)
- {
- if(ExamineFH(__stdfiledes[d],fib)!=DOSFALSE)
- ret=__stat(buf,fib);
- else
- __seterrno();
- FreeDosObject(DOS_FIB,fib);
- }
- else
- __seterrno();
- return ret;
- }
-
- int chmod(const char *name, mode_t mode)
- { int ret;
-
- if ((ret=~(SetProtection((STRPTR)name,((mode&S_IRUSR?0:FIBF_READ)|
- (mode&S_IWUSR?0:FIBF_WRITE|FIBF_DELETE)|
- (mode&S_IXUSR?0:FIBF_EXECUTE)|
- (mode&S_IRGRP?FIBF_GRP_READ:0)|
- (mode&S_IWGRP?FIBF_GRP_WRITE|FIBF_GRP_DELETE:0)|
- (mode&S_IXGRP?FIBF_GRP_EXECUTE:0)|
- (mode&S_IROTH?FIBF_OTR_READ:0)|
- (mode&S_IWOTH?FIBF_OTR_WRITE|FIBF_OTR_DELETE:0)|
- (mode&S_IXOTH?FIBF_OTR_EXECUTE:0))))))
- __seterrno();
-
- return ret;
- }
-
- ALIAS(lstat,stat);
-